iT邦幫忙

2022 iThome 鐵人賽

DAY 19
0
Modern Web

用 Node.js 打造後端 API系列 第 19

Day 19 - 忘記密碼3

  • 分享至 

  • xImage
  •  

前言


今天是重設密碼系列的最後一天!
要接著完成的功能:

  • 使用者make PUT request到來自email的url來更改密碼

更改密碼


使用者輸入email並按下忘記密碼後,會收到以下的信件:
https://ithelp.ithome.com.tw/upload/images/20220927/20151654SMiE1u3IQh.png
為了要讓使用者能拿這組url make PUT request更改密碼
我們要透過這組url來拿到未加密過的token (resetPassword/....token)
再拿這組token加密成原先儲存在db的格式
最後取得user的資料

  const resetPasswordToken = crypto
    .createHash('sha256')
    .update(req.params.resettoken)
    .digest('hex');

  const user = await User.findOne({
    resetPasswordToken,
    resetPasswordExpire: { $gt: Date.now() }
  });

  if (!user) {
    return next(new ErrorResponse('Invalid token', 400));
  }

若順利取得user的資料,接下來就能設定新密碼
並重新將reset密碼的token&到期時間設為undefined
再利用cookie回傳新的jwt token給使用者

  user.password = req.body.password;
  user.resetPasswordToken = undefined;
  user.resetPasswordExpire = undefined;
  await user.save();

  sendTokenResponse(user, 200, res);

值得注意的是
在User model的pre middleware中

UserSchema.pre('save', async function(next) {
  if (!this.isModified('password')) {
    next();
  }

  const salt = await bcrypt.genSalt(10);
  this.password = await bcrypt.hash(this.password, salt);
});

此處設定了,如果password type沒有符合格式的話
就繼續request response cycle
所以我們昨天在執行forgotPassword函式
能夠將resetPasswordToken&restPasswordExpire順利儲存
下課!


上一篇
Day 18 - 忘記密碼2
下一篇
Day 20 - 使用者更新資料
系列文
用 Node.js 打造後端 API30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言